<?php
 /*********************************************************************************
*  República Bolivariana de Venezuela                     
*  Ministerio del Poder Popular de Ciencia y Tecnologia
*  Fundación Instituto de Ingenieria                                                                                                                              
*  Centro de Procesamiento Digital de Imagenes - (CPDI)                                    
*                                                                                 
*                                                                                                  
*  Creado por: Ing. Luis Diaz - ldiazj@fii.gob.ve    			                                                                      
*	                                                                              
***********************************************************************************/

//Fecha de Creación:  18/08/2010

class AclController extends AppController
{

    var $name = 'Acl';
    var $helpers = array ('Html', 'Form', 'Ajax', 'Javascript', 'Paginator');
    var $uses = array ('Aro', 'Aco', 'Usuario');
    var $components = array ('RequestHandler', 'Acl');
	

	function beforeFilter() {
		parent::beforeFilter();
		$this->Auth->allowedActions = array('*');
	}
    
	function admin_index() {
		$this->layout = "admin";
	}
	
	function admin_aro_view($id=null){
		
		if(is_null($id) && !empty($this->data)){
			
			$id = $this->data['Aro']['parent_id'];
		}
		
		$this->set('aro', $this->Aro->read(null, $id));
		
		$listado = $this->Aro->find(
		'all',
			array (
			'conditions'=> array ('Aro.parent_id'=>$id), //array de condiciones
			'recursive'=>1, //int
			'fields'=> array ('Aro.alias', 'Aro.foreign_key'), //array de nombres de campos
			'order'=>null, //string o array definiendo el orden
			'group'=> array (), //campos para GROUP BY
			'limit'=>null, //int
			'page'=>null //int
			)
		);
		
		//pr($listado);
		
		$this->set('listado', $listado);
		
		$usuarios = $this->Usuario->find(
			'list',
			array (
			'conditions'=> array ('Usuario.id NOT IN(SELECT foreign_key FROM aros)'), //array de condiciones
			'fields'=> array ('Usuario.id', 'Usuario.usuario'), //array de nombres de campos
			'order'=>null, //string o array definiendo el orden
			)
		);
		$this->set('foreing_key', $usuarios);
		
		if(!empty($this->data)){
			$aro = new Aro();
			$aro->create();
			if($aro->save($this->data['Aro'])){
				$this->redirect('aro_view/'.$id);
			}
		}
		
	}
	
	function admin_aro() {
		$this->layout = "admin";
		$this->Aro->recursive = 0;
		$this->set('aros', $this->paginate('Aro', array('parent_id'=>NULL), array('order'=>'parent_id')));
	}
	
	function admin_aco() {
		$this->layout = "admin";
		$this->Aco->recursive = 0;
		$this->set('acos', $this->paginate('Aco', 'parent_id=2 OR parent_id=null'));
	}

	function admin_aro_add() {
		$this->layout = "admin";
		if(!empty($this->data)){
			//pr($this->data);
			$aro = new Aro();
			$aro->create();
			if($aro->save($this->data)){
				$this->redirect('aro');
			}
		}

	}
	
	function admin_aco_define(){
		$aros = $this->Aro->find(
		'list',
		array (
		'conditions'=> array (), //array de condiciones
		'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
		'order'=>null, //string o array definiendo el orden
		)
		);
		$this->set('aros', $aros);
	}
	
	function admin_aco_add(){
		$this->layout = "admin";
		if(!empty($this->data)){
			
			if (isset($this->data['parent_id']) &&  !$this->data['parent_id']) {
				$this->data['AclAco']['parent_id'] = null;
			}
			//pr($this->data);exit;
			$aco = new Aco();
			$aco->create();
			
			if($aco->save($this->data['Aro'])){
				$this->redirect('aco');	
			}
		}
		
	}
	
	function admin_permisos(){
		$this->layout = "admin";
		
/*
		$this->Acl->allow('Administrador', 'Niveles');
		$this->Acl->deny(array('model' => 'Usuario', 'foreign_key' => 2), 'Niveles', 'create');
		$this->Acl->deny(array('model' => 'Usuario', 'foreign_key' => 2), 'Niveles', 'read');
*/
		
		$aros = $this->Aro->find(
			'list',
			array (
			'conditions'=> array ('Aro.parent_id'=>NULL), //array de condiciones
			'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
			'order'=>null, //string o array definiendo el orden
			)
		);
		
		$this->set('aros', $aros);
	}
	
	function admin_grupo_permiso($aro_id) {
		//pr($this->data);

		//$aro_id = $this->data['Aro']['aro'];
		$this->data['Aro']['aro'] = $aro_id;
		$aco_id = $this->data['aco'];
		$aro_alias = $this->Aro->read('alias', $aro_id);
		$aro_alias = $aro_alias['Aro']['alias'];
		$aco_alias = $this->Aco->read('alias', $aco_id);
		$aco = $aco_alias['Aco']['alias'];
		$tipo = $this->data['tipo'];
		
		if($this->_setPermisos($aro_alias, $aco, $tipo, $this->data['permisos'])){
			$this->set('msg_flash', "LOS PERMISOS HAN SIDO ASIGNADOS con exito.");
		}else{
			$this->set('msg_flash', "LOS PERMISOS NO HAN SIDO ASIGNADOS. POR FAVOR, verifique los datos he INTENTE NUEVAMENTE.");
		}
		$aro_id = $this->data['Aro']['aro'];
			$miembros = $this->Aro->find(
			'all',
				array (
				'conditions'=> array ('Aro.parent_id'=>$aro_id), //array de condiciones
				'recursive'=>1, //int
				'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
				'order'=>null, //string o array definiendo el orden
				'group'=> array (), //campos para GROUP BY
				'limit'=>null, //int
				'page'=>null //int
				)
			);
			$grupo = $this->Aro->find(
			'all',
				array (
				'conditions'=> array ('Aro.id'=>$aro_id), //array de condiciones
				'recursive'=>1, //int
				'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
				'order'=>null, //string o array definiendo el orden
				'group'=> array (), //campos para GROUP BY
				'limit'=>null, //int
				'page'=>null //int
				)
			);
			
			$objetos = $this->Aco->find(
			'list',
				array (
				'conditions'=> array ("parent_id=2 OR id=2"), //array de condiciones
				'recursive'=>1, //int
				'fields'=> array ('Aco.id', 'Aco.alias'), //array de nombres de campos
				'order'=>null, //string o array definiendo el orden
				'group'=> array (), //campos para GROUP BY
				'limit'=>null, //int
				'page'=>null //int
				)
			);
			
		
		$this->set('grupo', $grupo);
		$this->set('miembros', $miembros);
		$this->set('objetos', $objetos);
		
		$this->render('admin_aro_view_miembros');
		
	}
	
	function _setPermisos($aro=null, $aco=null, $tipo=-1, $permisos= array()){
		
		if(is_null($aco) || is_null($aro)){
			return false;
		}
		
		switch($tipo){
			case 1:
				if(isset($permisos['all'])){
					$this->Acl->allow($aro, $aco);
				}else{
					foreach($permisos as $key=>$value){
						//echo "$key => $value";
						$this->Acl->allow($aro, $aco, $key);
					}
				}
						
			break;
			case -1:
				if(isset($permisos['all'])){
					$this->Acl->deny($aro, $aco);
				}else{
					foreach($permisos as $key=>$value){
						//echo "$key => $value";
						$this->Acl->deny($aro, $aco, $key);
					}
				}
			break;
				
		}
		return true;
	}
	
	function _setPermisosMiembros($foreign_key=null, $aco, $tipo=-1, $permisos= array(), $model='Usuario'){
		
		if(is_null($aco) || is_null($foreign_key)){
			return false;
		}
		
		switch($tipo){
			case 1:
				if(isset($permisos['all'])){
					$this->Acl->allow(array('model'=>$model, 'foreign_key'=>$foreign_key), $aco);
				}else{
					foreach($permisos as $key=>$value){
						//echo "$key => $value";
						$this->Acl->allow(array('model'=>$model, 'foreign_key'=>$foreign_key), $aco, $key);
					}
				}
						
			break;
			case -1:
				if(isset($permisos['all'])){
					$this->Acl->deny(array('model'=>$model, 'foreign_key'=>$foreign_key), $aco);
				}else{
					foreach($permisos as $key=>$value){
						//echo "$key => $value";
						$this->Acl->deny(array('model'=>$model, 'foreign_key'=>$foreign_key), $aco, $key);
					}
				}
			break;
				
		}
		return true;
	}

	
	function admin_aro_view_miembros(){
		
		if(!empty($this->data) && $this->data['Aro']['aro']){
			$aro_id = $this->data['Aro']['aro'];
			$miembros = $this->Aro->find(
			'all',
				array (
				'conditions'=> array ('Aro.parent_id'=>$aro_id), //array de condiciones
				'recursive'=>1, //int
				'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
				'order'=>null, //string o array definiendo el orden
				'group'=> array (), //campos para GROUP BY
				'limit'=>null, //int
				'page'=>null //int
				)
			);
			$grupo = $this->Aro->find(
			'all',
				array (
				'conditions'=> array ('Aro.id'=>$aro_id), //array de condiciones
				'recursive'=>1, //int
				'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
				'order'=>null, //string o array definiendo el orden
				'group'=> array (), //campos para GROUP BY
				'limit'=>null, //int
				'page'=>null //int
				)
			);
			
			$objetos = $this->Aco->find(
			'list',
				array (
				'conditions'=> array (), //array de condiciones
				'recursive'=>1, //int
				'fields'=> array ('Aco.id', 'Aco.alias'), //array de nombres de campos
				'order'=>null, //string o array definiendo el orden
				'group'=> array (), //campos para GROUP BY
				'limit'=>null, //int
				'page'=>null //int
				)
			);
			
			
		}else{
			$grupo = $miembros = $objetos =array();
		}
		
		$this->set('grupo', $grupo);
		$this->set('miembros', $miembros);
		$this->set('objetos', $objetos);
		
		
	}
	
	function admin_aro_miembro_add($aro_id) {
		$this->layout= "ajax";
		$usuarios = $this->Usuario->find(
		'list', 
		array(
			'conditions' => array('Usuario.aro_id' => $aro_id), //array de condiciones
		 	'fields' => array('Usuario.id', 'Usuario.name'), //array de nombres de campos
			'order' => null, //string o array definiendo el orden
		)
		);
		$this->set('usuarios', $usuarios);
		$objetos = $this->Aco->find(
			'list',
				array (
				'conditions'=> array ('parent_id'=>'2'), //array de condiciones
				'recursive'=>1, //int
				'fields'=> array ('Aco.id', 'Aco.alias'), //array de nombres de campos
				'order'=>null, //string o array definiendo el orden
				'group'=> array (), //campos para GROUP BY
				'limit'=>null, //int
				'page'=>null //int
				)
		);
		$this->set('objetos', $objetos);
		$this->set('aro_id', $aro_id);
	}
	
	function admin_aro_miembro_add_permiso($aro_id){
		
		//pr($this->data);
		$aco_id = $this->data['Aro']['aco_id'];
		$usuario_id = $this->data['Aro']['usuario_id'];
		$aro_alias = $this->Aro->read('alias', $aro_id);
		$aro_alias = $aro_alias['Aro']['alias'];
		$aco_alias = $this->Aco->read('alias', $aco_id);
		$aco = $aco_alias['Aco']['alias'];
		$tipo = $this->data['tipo2'];
		
		if($this->_setPermisosMiembros($usuario_id, $aco, $tipo, $this->data['permisos2'])){
			$this->set('msg_flash', "LOS PERMISOS HAN SIDO ASIGNADOS con exito.");
		}else{
			$this->set('msg_flash', "LOS PERMISOS NO HAN SIDO ASIGNADOS. POR FAVOR, verifique los datos he INTENTE NUEVAMENTE.");
		}
		$miembros = $this->Aro->find(
		'all',
			array (
			'conditions'=> array ('Aro.parent_id'=>$aro_id), //array de condiciones
			'recursive'=>1, //int
			'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
			'order'=>null, //string o array definiendo el orden
			'group'=> array (), //campos para GROUP BY
			'limit'=>null, //int
			'page'=>null //int
			)
		);
		$grupo = $this->Aro->find(
		'all',
			array (
			'conditions'=> array ('Aro.id'=>$aro_id), //array de condiciones
			'recursive'=>1, //int
			'fields'=> array ('Aro.id', 'Aro.alias'), //array de nombres de campos
			'order'=>null, //string o array definiendo el orden
			'group'=> array (), //campos para GROUP BY
			'limit'=>null, //int
			'page'=>null //int
			)
		);
		
		$objetos = $this->Aco->find(
		'list',
			array (
			'conditions'=> array ('parent_id'=>'2'), //array de condiciones
			'recursive'=>1, //int
			'fields'=> array ('Aco.id', 'Aco.alias'), //array de nombres de campos
			'order'=>null, //string o array definiendo el orden
			'group'=> array (), //campos para GROUP BY
			'limit'=>null, //int
			'page'=>null //int
			)
		);
			
		$this->data['Aro']['aro'] = $aro_id;
		$this->set('grupo', $grupo);
		$this->set('miembros', $miembros);
		$this->set('objetos', $objetos);
		$this->render('admin_aro_view_miembros');
	}
	

}//FIN DEL CONTROLADOR ACL
?>